home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / unix / ls_4_0k / part02 < prev    next >
Encoding:
Internet Message Format  |  1990-07-03  |  45.3 KB

  1. Path: xanth!cs.odu.edu!Amiga-Request
  2. From: Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v90i196: ls 4.0k - yet another unix-like ls command, Part02/04
  5. Message-ID: <13040@xanth.cs.odu.edu>
  6. Date: 3 Jul 90 19:23:52 GMT
  7. Sender: tadguy@cs.odu.edu
  8. Reply-To: kim@uts.amdahl.com (Kim E. DeVaughn)
  9. Lines: 1223
  10. Approved: tadguy@cs.odu.edu (Tad Guy)
  11. X-Mail-Submissions-To: Amiga@cs.odu.edu
  12. X-Post-Discussions-To: comp.sys.amiga
  13.  
  14. Submitted-by: kim@uts.amdahl.com (Kim E. DeVaughn)
  15. Posting-number: Volume 90, Issue 196
  16. Archive-name: unix/ls-4.0k/part02
  17.  
  18. #!/bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 2 (of 4)."
  25. # Contents:  ls.uu src/ls.c.ab
  26. # Wrapped by tadguy@xanth on Tue Jul  3 15:22:11 1990
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'ls.uu' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'ls.uu'\"
  30. else
  31. echo shar: Extracting \"'ls.uu'\" \(22474 characters\)
  32. sed "s/^X//" >'ls.uu' <<'END_OF_FILE'
  33. Xbegin 755 ls
  34. XM```#\P`````````"``````````$```Q9```#%P```^D```Q9)$@D`$GY````;
  35. XM`$CGP."9_``````@/```%#PB/``!``$L>``$3J[_.DJ`9@``"$S?!P-.=2!`=
  36. XM)$`B0"`\```"\2#<4X!F^B`<9PX@2='<U=`@BB1)4X!@\"A)V?P`````3-\'B
  37. XM`RQX``0I3@O(*4\+S"9N`11P`"(\```P`$ZN_LY*JP"L9B1!ZP!<3J[^@$'K,
  38. XM`%Q.KOZ,)`!G``":3J[_?")"3J[^AF```(Q#^@"H<`!.KOW8*4`4.&8$<&1@'
  39. XM7B9K`*S7R]?+)FL`$-?+U\L@`G(`$AO0@5*`3KD``"8(2H!G1BE`"\0B2R!`9
  40. XM<``0*___3KD``"SJ#$(``F4.$/P`("`"(DI.N0``+.H@;`O$3KD``"'X<`!@K
  41. XM!"`O``0O`"!L"\1.N0``)BPB;!0X+'@`!$ZN_F(@/```%#PB3)/\`````"X?.
  42. XM+FP+S"QX``1.KO\N(`=.=61O<RYL:6)R87)Y`$Y5__A(YR`"*T#_^$CM``+_8
  43. XM_$JL``!G%@@L````#F<.)"P``"("+&P4.$ZN_Z9*K``$9P@@;``$3KHDDDJL,
  44. XM``AG""!L``A.NB2$D\DL>``$3J[^VB!`(6P+\`"X(6W_^`"4("W__$ZZ+?1,)
  45. XMWT`$3EU.=4Y5__Q(YP$2)D@N`$JL``!G'`@L````#F<4("P``"(`+&P4.$ZN1
  46. XM_Z:1R"E(``!P_[Z`9@XL;!0X3J[_?"E``"0N`"!+0^P'BDZZ+8I2@"]```Q!>
  47. XM[!$X(DM.NBQT(&\`#$/L$3@@"$(Q"``@!W)GD(%G.')CD(%G0E6`9U13@&=09
  48. XM7X!G3%.`9UQ;@&=F7X!G<%.`9WH$@``!T_)G``"`<@J0@6<``()@``"20>P''
  49. XMC&$`!X8@!W(480#^UB\+2&P'H$AL$3A.NB.J3^\`#&```)`O"TAL![Y(;!$XM
  50. XM3KHCE$_O``Q@>D'L$3A#[`?>3KHL(&!L0>P1.$/L!_I.NBP28%Y![!$X0^P(D
  51. XM'$ZZ+`1@4$'L$3A#[`A"3KHK]F!"0>P(4F$`!Q1@0"\+2&P(?DAL$3A.NB,^[
  52. XM3^\`#&`D+P<O"TAL"*)(;!$X3KHC*$'L$3AA``;F(`=R%&$`_C9/[P`00>P1]
  53. XM.&$`!M),WTB`3EU.=4Y5_\Q(YP\R)D@D22(\___W-=*2+T$`'.6!5H$K0/_8"
  54. XM(`$B/```!;5.NBS&*@`&A0``!\`B/```!;4K0/_H3KHLD$J`:@)6@.2`(B\`>
  55. XM')*`(`'EB-"!5(`O00`<<F9&`4ZZ+(YR9D8!*T#_[$ZZ+&)4@'(%3KHL>B(OC
  56. XM`!R2@%*!+BW_[%:'2.\``@`@<`R^@&\$4H6>@"M'_^P,A0``!]!L"B`%!(``#
  57. XM``=L8`@@!02````'T"X`("H`"'(R3KHL,B]``"0@*@`$<CQ.NBP$(B\`)-"!R
  58. XM<CPO0``D3KHL%"P!("\`)'(\3KHL"'(\+T``)$ZZ*_XH`2`O`"1R/$ZZ*_)RF
  59. XM&$ZZ*^PO00`<("W_V`R`````!V0``6;00#`[``9.^P`$``P`=`"B`-``\@$4,
  60. XM`39![?_<(@@L;!0X3J[_0"`M_]R0DBP`("W_[.6`0>P&O-'`)$@N+P`@<%K0?
  61. XM@+R`;@1*AFH8+P4O!R\22&P(N"\+3KHAD$_O`!1@``$(+P0O+P`@+P<O$DALI
  62. XM",8O"TZZ(71/[P`88```["`M_^SE@"\&+P0O+P`D+P4O+P`P0>P&O"\P"`!(N
  63. XM;`C<+PM.NB%&3^\`(&```+X@+?_LY8`O!B\$+R\`)"\'0>P&O"\P"``O+P`T:
  64. XM2&P(_B\+3KHA&$_O`"!@``"0+P8O!"\O`"0O!R\O`#`O+?_L2&P)("\+3KH@W
  65. XM]$_O`"!@;"\&+P0O+P`D+P<O+P`P+RW_[$AL"48O"TZZ(-)/[P`@8$HO!B\$Z
  66. XM+R\`)"\'+RW_["\O`#1(;`EL+PM.NB"P3^\`(&`H+P8O!"\O`"0O+P`L+RW_!
  67. XM["\'2&P)DB\+3KH@CD_O`"!@!D(3<`%@`G``3-],\$Y=3G5.5?_T2.<`,"9M:
  68. XM``A([0,`__0D;?_T($I2BB)M__@@$4J`;P1P9&`"<"T0@")*4HH(*P`'``-G`
  69. XM!'!H8`)P+1*`(DI2B@@K``8``V<$<'-@`G`M$H`B2E**""L`!0`#9P1P<&`"`
  70. XM<"T2@")*4HH(*P`$``-G!'!A8`)P+1*`(DI2B@@K``,``V<$<"U@`G!R$H`B_
  71. XM2E**""L``@`#9P1P+6`"<'<2@")*4HH(*P`!``-G!'`M8`9P`!`L!O`2@")*.
  72. XM4HH(*P````-G!'`M8`)P9!*`0A(@$R(``D'_`$J!9QHD2`@```=G"!5\`$@`<
  73. XM`6`&%7P`*P`!<`%@`G``3-\,`$Y=3G5.5?_T2.<A$B9)*TC_^`@L``8`$V8`0
  74. XM`(Y*K``H9E8@+?_X(@`D+``(+&P4.$ZN_XY*@&8V2JP)N&9J(#P``"`@P*P`(
  75. XM#&=>4JP)N$ZN_WPO`$AL";Q(;!$X3KH?&D'L$3AA``+83^\`#&`Z(&P`""XHL
  76. XM`!1@!"XL`"@@*P!\(@=.NBCB2H%G!'`!8`)P`"]``!`@*P!\(@=.NBC*(B\`O
  77. XM$-"!)T``@$S?2(1.74YU3E7__$CG(1`F2`@L``(`$V9$("L`@')(3KHHG$J!H
  78. XM9P1P`6`"<``O0``,("L`@')(3KHHA"(K`(#0@20O``S0@BX`2JL`?&8$<`%@+
  79. XM`G``)`?4@"`"8`0@*P"`3-\(A$Y=3G5.5?^X2.<!$"9(0>L`!$/K`'0O"2](P
  80. XM``Q![!$X(F\`#&$`_<Y83THK`)!F#D'L$3A#[`H`3KHFSF`,0>P1.$/L"@1.#
  81. XMNB;`""P`!0`,9QXO$TAL"@A(;?^\3KH>#$'L$3A#[?^\3KHFGD_O``P@2V$`7
  82. XM_RXO*P!\+P!(;`H.2&W_O$ZZ'>1![!$X0^W_O$ZZ)G9!ZP"$+T@`&"`L`!A!@
  83. XM[?^\(F\`&&$`^KY![!$X0^W_O$ZZ)E)![!$X0^P*'$ZZ)D9![!$X80`!9D_O&
  84. XM`!`@*P`$2H!O"$'L!OYA``*<0BP1.`@L``8`#&8(""P``P`.9S1![!$X(FP2Q
  85. XM\$ZZ)@I![!$X3KHEVBX`<`&^@&\8<#I![!$XL#!X_V<,0>P1.$/L"B!.NB7B1
  86. XM0>L`""](``A![!$X(F\`"$ZZ)<Y^``@L``8`#&<Z0>P,B$ZZ)90N`"`'0>P1W
  87. XM.$/L#(A.NB4(2H!F'$'L$3A.NB5XOH!L$'`O0>P1.+`P>`!F!E*'8`)^``@L7
  88. XM``0`#&<4("L`!$J`;PQ![!$X0^P*(DZZ)6Y![!$X0^P*)$ZZ)6)![!$XT<=A<
  89. XM``"`("L`!$J`;PA![`;Q80`!N@@L``<`#V<T2BL`D&<N0>P&_F$``:1!ZP"0"
  90. XM+PA(;`HF2&P1.$ZZ'()![!$X80``0$'L!O%A``&"3^\`#$S?"(!.74YU+PL@B
  91. XM/````1!.NAP@)D!*@&<,(`MR#-"!)T``"&`&".P````/(`LF7TYU2.<P$B9(8
  92. XM($M.NB2F2H!O$"(L"^@D"R8`+&P4.$ZN_]!,WT@,3G5.5?_\2.<P`BM(__P@:
  93. XM+`OH(@`D+?_\=@$L;!0X3J[_T$S?0`Q.74YU+PX(+``$`!9F)'``(@`L>``$G
  94. XM3J[^SBE``!0(```,9Q1![`HL88P([`````]@!@CL````#RQ?3G5.5?_\2.<Q<
  95. XM`BX`*T'__"`L`#"PK`P<;P``A'`!OH!O?`@L``<`#F9T0>P'%V$``)8@!U.`#
  96. XM+RW__"\`2&P*/$AL$3A.NAMP0>P1.$ZZ(]Y/[P`0(BP`,+*`;@Q![!$X0^P*V
  97. XM5$ZZ)FI![!$X80#_#D'L!O%A``!0("P+["(`0>P1."0()CP```$L+&P4.$ZN;
  98. XM_]9![`I>80#^Y&$`_RY,WT",3EU.=4CG`Q`F2"X`?`!@!"934H:\AVP$2I-FE
  99. XM]"`+3-\(P$YU3E7__"M(__P(+``!``]G""!M__QA`/Z@3EU.=4Y5_\!(YR\PY
  100. XM*TC_Q$'L!O5ATD'M_^1#[?_@3KH:Z$JL`#!F!BEM_^0`,$JL`"QF!BEM_^``Y
  101. XM+"9M_\0(+``"``QG``'(>@!^`"938%0@:P`(("@`!$J`;Q8(+``!``]F#D/HJ
  102. XM``@@24/L!H-.NB,&(&L`"%"(3KHBU-Z`4H4(+``"``YG&B!K``@@*``$2H!O5
  103. XM#D/H``@@24ZZ(K*>@%.%)E-*DV:H2H5F`E*%(`<O0``<(`<B!4ZZ)`PN`"`OC
  104. XM`!PB!4ZZ)`!*@6<"4H<@+``PL*P,'&\(""P``P`,9P1X`6`:>``K0/_D8`H@D
  105. XM!U2`D:W_Y%*$("W_Y+"';.YP8W(`0>P,)!#!4<C__"`%(@1.NB.T+``@!2($[
  106. XM3KHCJDJ!9P)2AGX`(&W_Q"108```C$*M_^0F2F!2""P``@`.9Q`@:P`(("@`9
  107. XM!$J`;P1P`6`"<`!&@&<F(&L`"%"(3KHA\"!M_^1R`$/L#"0D"!(Q*`"P@6\(;
  108. XM0^P,)!.`*`!2K?_D(`8@2V$`_D(F0"`M_^2PA&P$2I-FHDJ'9APH+?_D(`4B?
  109. XM!$ZZ(R(L`"`%(@1.NB,82H%G`E*&4H<D4BM&_]B^AFP&2I)F`/]J?`!"K?_D=
  110. XM8`QP`!`35(#<@"M'_^1![`PD("W_Y-'`)D@N`%*'OH1MX'``$!,N!MZ`<`&XT
  111. XM@&\``.Z^K``P;P``YE.$8`#^\@@L``0`#&<$4JP,''X`)%-@2`@L``0`#&<FV
  112. XM(&H`"$?H``@@*``$2H!O#"!+0^P&@TZZ(39@"B!+0^P*:$ZZ(2I2AP@L``(`T
  113. XM#F<.(&H`""`H``1*@&\"4X<D4DJ29K0@+`P<(BP`,+*`;P@(+``#``QG!'@!D
  114. XM8!)4@"]``!P@`2(O`!Q.NB(T*``@!R]``!P@!R($3KHB)"X`("\`'"($3KHB;
  115. XM&$J!9P)2ARM'_]AP8W(`0>P,)!#!4<C__"M!_^1@%B!M_^0@+`P<0^P,)"((G
  116. XM$X`8`%*M_^0@+?_DL(1MXB`L`"Q3@$CM``'_U&X&<@$K0?_4<`$L+?_8*T#_%
  117. XMT"`&(BW_U$ZZ(;0J`"`&(BW_U$ZZ(:A*@6<"4H4K1?_<?@`K;?_4_^`@;?_$F
  118. XM)E!@``%,<`&Z@&\T("W_X+"M_]1F*G``*T#_X`@L``$`#V<4("W_T"(%80#[U
  119. XMP@@L````#V8``30J+?_<4JW_T$*M_^0D;?_(8```V"!J``@@*``$2H!J&$/H7
  120. XM``A![!$X3KH?[D'L$3A.NA^N*@!@6$(L$3AZ``@L``(`#F9*(&H`"%"(3KH?V
  121. XMDBH`""P``0`/9PQ![!$X0^P&_DZZ'Z0@:@`(4(@O2``<0>P1.")O`!Q.NA^.\
  122. XM""P``0`/9PQ![!$X0^P&\4ZZ'WH@!B!*80#[Q"1`("W_Y"(`4H&RA&PT2I)G&
  123. XM,'(`0>P,)!(P"``N`5*'0>P1.$ZZ'R(L`&`(%KP`(%.'4H9![!$XT<8F2+Z%&
  124. XM;.Q"$T'L$3AA`/I04JW_Y"HM_]PL+?_8("W_Y+"$;`9*DF8`_QI![`<F80#ZX
  125. XM5&$`^G@N+?_,4H=2K?_@(&W_R"90*TO_R"M'_\P(+`````]F"KZ&;`9*DV8`T
  126. XM_IY![`;Z80#[0DS?#/1.74YU3E7__$CG`#`F2"1)0I)@''``$!LO0``((!)R>
  127. XM"DZZ']@B+P`(T(%R,)"!)(`0$W(PL`%E!G(YL`%CUB`+3-\,`$Y=3G5.5?_<.
  128. XM2.<A,BM(_^@@;!+P3KH>2"X`(&P2\")(T\<F22)++TD`&'`!OH!O&'`ZL"O_^
  129. XM_V<0%KP`+R!L$O`L2-W'0BX``2!L$O!.NAX0(&P2\-'`)D@D;?_H+T@`%"`JL
  130. XM``1*@&\4""P``0`/9PP@2T/L!OY.NAX>)D!!Z@`(+T@`'"!+(F\`'$ZZ'@HF$
  131. XM0"`J``1*@&\2""P``0`/9PH@2T/L!O%.NAWN1>P1."9L!X9@``$8$!-R);`!O
  132. XM9PQT7+`"9P84P&```0)2B[`!9@``TB!+0^W_[&$`_N8F0"M+__`,K0```&/_0
  133. XM[&\&<&,K0/_L<``0$P1``"5G<`1``#UG*E5`9QH$0``*9RQ50&<*5T!G'E-`;
  134. XM9PY@7D?L$L1@7$?L$KA@5D?L$N1@4$?L$J1@2D?L$M!@1"!M_^@@*``$2H!O)
  135. XM%`@L``$`#V<,("W_[$J`;P1>K?_L""P``P`.9P8F;!+P8!8F;P`48!`@2A"\!
  136. XM`"54BD(H``%'[`<G($M.NAS>+@!@!A3\`"!2A[ZM_^QM]"!*(DM.NAS^)$`F3
  137. XM;?_P8"AP`!`3!$``7&<8!$``$F<&74!G"&`0%/P`"F`*%/P`"6`$%/P`7$(26
  138. XM4HM*$V8`_N9![!$X80#WU@@L``<`#V<X)FW_Z$HK`)!G+D'L!OYA`/D&0>L`B
  139. XMD"\(2&P*:DAL$3A.NA/D0>P1.&$`]Z)![`;Q80#XY$_O``P@;P`80A!,WTR$Z
  140. XM3EU.=4CG(Q`F2'X`1@?.JP!T0>P2Q$/L"G1.NAQ6&6P&\!++?`-@+G`!(@#M%
  141. XMH<*'9PI![!+,D<9R+1"!(@98@20`XZ(B!\*"9@I![!+(D<80O``M4X9*AFK.L
  142. XM2BL`D&8&&7P`+1+$0>L`A$AL$N1#[!*X3KH62%A/("L`!$J`;S`(+``"`!-G1
  143. XM#D'L$J1#[`I^3KH;X&`,0>P2I$/L"H!.NAO20>P2T$/L"H).NAO&8"@@2V$`O
  144. XM]$@O`$AL!@I(;!*D3KH3`BZK`'Q(;`8*2&P2T$ZZ$O)/[P`4($MA`/T$3-\(#
  145. XMQ$YU2.<P,"9(0>P&]6$`]^1P`"E`#!@I0`P4)E-@5&$`]M8(+`````]F``#,]
  146. XM(&L`""`H``1*@&\(""P``@`.9C`D2`@L``$`#&<(($IA`/[48`8@2F$`]"8@>
  147. XM:P`(80#SO-&L#!0@:P`(("@`?-&L#!@F4TJ39J@@/(````'`K``,9FP(+``"9
  148. XM``YF."`L#`PB+`P0)`'4@'8!M(-O4B\L#!@O+`P4+P$O`$AL!@Y(;!$X3KH2:
  149. XM,$'L$3AA`/7N3^\`&&`L("P,$'(!L(%O(B\L#!@O+`P4+P!(;`9#2&P1.$ZZ4
  150. XM$@)![!$X80#UP$_O`!1![`;Z80#V_DS?#`Q.=2\+)D@(+``#``UG$D'L"]PB5
  151. XM2TZZ%VA*@&L$<`!@'`@L``(`#6<2($M#[`O03KH73DJ`:P1P`&`"<`$F7TYU9
  152. XM2.<`$B9((`MG'F`0($LL>``$3J[^^"!`3KH1>"!32I!FZB!+3KH1;$S?2`!.3
  153. XM=4Y5_]Q(YR<R)DDK2/_L<``I0`P0*4`,#"X`*4`,''`,3KH1'B]``"1*@&8&Y
  154. XM<`!@``)&(&\`)$ZZ'$QP#$ZZ$0(O0``@2H!G``(<($!.NAPV80#U/`@L````P
  155. XM#V8``?H@+?_L(@`D"RQL%#A.KO^4+`!*AF<``6A!ZP"$80#_&$J`9P`!6B`KW
  156. XM``1*@&\&1>P.X&`$1>P0#$'K``@O2``<(DI.NA34*@`D;P`<""P`!P`-9BQ*S
  157. XMA6<H("P`#"]``"@(P``5*4``#"!*0^P*ADZZ%*@J``I%``$@+P`H*4``#`@L<
  158. XM``8`#6842H5G$"!*0^P*CDZZ%(0J``I%``$(+``$``YG%$J%9Q`@2B)L$O1.Q
  159. XMNA1H*@`*10`!""L`!P!W9Q`(+`````QG!'`!8`)P`"H`2H5G``"J4H<@*P`$X
  160. XM2H!O-"!O`"`B2TZZ%C)*@&<``1@(+``"``]G``"&4JP,#%*L"_A2K`P`""P`J
  161. XM`@`39C92K`P$8#`(+``#``]G8E*L#!!2K`O\4JP,`"!M_^PB2V$`\'@@2V$`!
  162. XM\1[1K`P$("L`?-&L#`@@;P`<3KH82"H`NJP,'&\:("L`!$J`:@8I10P<8`P(;
  163. XM+``"``YF!"E%#!P@;P`D(DM.NA6D2H!G``"*2H9F`/YP("P,#-"L#!!F-@@L(
  164. XM``8`#F9B2H=F"`@L``(`#F<*0>P*DF$`\SI@3`CL``0`$P@L``4`#V<^0>P*"
  165. XMGF$`\R)@-'`,P*P`#&<L""P`!0`/9@X@;P`D80#T;E*L"_1@""!O`"1A`/Q4J
  166. XM("P,#-"L#!!O!%*L"_0@;P`D80#]=B`O`"!@$B!O`"1A`/UH(&\`(&$`_6!PJ
  167. XM`$S?3.1.74YU3E7_K$CG(3(F2"M)_[0@"R(`)"P`!"QL%#A.KO^:2H!F/$ZNP
  168. XM_WPN`'!MT("^@&802&P*J$AL$3A.N@["4$]@$B\'2&P*RDAL$3A.N@ZP3^\`5
  169. XM#$'L$3AA`/)J8``#'%*L`!P@;``$("@`!$J`;P``^@@L``8`#F8``/`D;?^T)
  170. XM2A)G``#F#*P````!`!QO``#:($I#[`VT3KH6ZDJ`9P``RD'L$3@B2DZZ&6Y^3
  171. XM``@L``,`#F8``(Y![`VT3KH6MD'L#(A#[`VT3KH6+DJ`9QA![`R(3KH6GD'LK
  172. XM#;1#[`R(3KH6%DJ`9EQ![`VT3KH6AB]``!1![`R(3KH6>B(O`!2R@&X&1>P-[
  173. XMM&`$1>P,B"!*3KH68BX`(`=![!$X(DI.NA782H!F'$'L$3A.NA9(OH!L$'`OT
  174. XM0>P1.+`P>`!F!E*'8`)^`$'L$3A#[`KJ3KH63D'L!OYA`/*X0>P1.-''80#Q4
  175. XM9$'L!O%A`/*F(&P`!"`H``1*@&IB""P``P`/9P`!^$'L#;0B2$ZZ$[0@2R)LY
  176. XM``1A`.WX""P``0`,9PH@;``$80#YG&`((&P`!&$`[NQ2K`O\4JP,`"!L``1AU
  177. XM`.YZT:P,!"!L``0@*`!\T:P,"`CL``$`$V```:`N+``,"`<`"F<(`*P``P```
  178. XM``P@2R)L``1A`/N2+T``&$J`9P`!=@@'``1F"`@'``IG``%<(@<"0?O_*4$`4
  179. XM#"!`)E!@``%$80#P\@@L````#V8``3P@:P`(("@`!$J`;P`!)B!M_[1.NA4T`
  180. XM(&L`"%"(+T``%$ZZ%28B+P`4TH!P)-*`(`%.N@QF)$!*@&<``/@@;?^T2A!GW
  181. XM,B!*(FW_M$ZZ%30@;?^T3KH4]%.`(&W_M!(P"`!T.K("9Q!T+[("9PH@2D/L6
  182. XM!H-.NA3\(&L`"%"(+T@`%"!*(F\`%$ZZ%.@@+``<L*P`(&<``)@B"G3^+&P47
  183. XM.$ZN_ZPO0``42H!G``""""P`!@`.9@A![`<F80#P!"E*$O`(+````!-G+$'MW
  184. XM_]A#[`[@3KH7&AE\`"H.X$(L#N%![?^X0^P0#$ZZ%P09?``J$`Q"+!`-(&\`_
  185. XM%")*80#\V@@L````$V<80>P.X$/M_]A.NA;<0>P0#$/M_[A.NA;0("\`%"(`\
  186. XM+&P4.$ZN_Z8@2DZZ"XPF4TJ39@#^NBE'``P@;P`880#YYBE'``Q3K``<3-],S
  187. XMA$Y=3G5.5?_L2.<`,$CM`P#_\"9M__`@;?_T0I!@``"$4HL0$W(@L`%G]G()9
  188. XML`%G\'(*L`%GZDH39W8@;?_T(!`B`.6!(&T`"-'!)$@@;?_T4I!P(K`39B8@N
  189. XM2U*+)(LO2``(8`)2BTH39P9P(K`39O1*$V8&)*\`"&`V0AM@)"2+8`)2BTH3T
  190. XM9Q00$W(@L`%G#'()L`%G!G(*L`%FYDH39Q!"&R!M__0,D````"!M`/]T3-\,J
  191. XM`$Y=3G5.5?_T2.<A,B9(*TG_]'X`(#P```$$3KH*=B1`2H!G0B(+=/XL;!0X<
  192. XM3J[_K"9`(`MG*B`+(@`D"DZN_YI*@&<00^H`A"QM__0LV2S9+-E^`2`+(@`L>
  193. XM;!0X3J[_IB!*3KH*4B`'3-],A$Y=3G5.5?_X+PLK0/_X!(```=3`9PAR"I"!"
  194. XM9QA@+$AL!RI(;`KN2&P1.$ZZ"C1/[P`,8#Q(;`<J2&P+&DAL$3A.N@H>3^\`N
  195. XM#&`F1^P'+F`,(%-A`.W280#N'%B+""P````/9@1*DV;H<``B`&$`Y1!![!$X]
  196. XM80#ML'!X<A1A`.4`)E].74YU3E7_X$CG#S(F2"M!_^@N`"P'4H9Z`2('Y8$@[
  197. XM2]'!*T#_Y"](`!P@4$ZZ$B8H`&``!5`B;P`<(%'1Q21(<``0$@1``#!M``4J-
  198. XM#$``2VP`!2+00#`[``9.^P`$!08%!@4&!08%!@4&!08%%`44!10%%`44!10%@
  199. XM%`44`)0%%`">`*H`\@#\`0@!$@%6`6`!:@44`70!@`',`=8"7`+B`NX#!`,64
  200. XM`R`%%`,J`S8#0`.>`_0%%`44!10%%`44!10$``0*!!0$(`0J!#0%%`0^!$@%S
  201. XM%`12!&($;`1V!(`$B@24!)X$I@2N`)0$M@44!+X%%`3^<`!A`/Z*8``$A@"L5
  202. XM`<`````,8``$>DHJ``%G$D'J``%#[``H80#RG"H$8``$8BX&4H<@+?_HL(=LC
  203. XM#AE2!RH@/``!U,IA`/Y((`;E@"!S"`!#[``H80#R;"P'8``$,@CL``,`#&``T
  204. XM!"@`K``#````#&``!!P(K``!``]@``022BH``6<,0>H``2E(!X8J!&`F+@92M
  205. XMAR`M_^BPAVP.&5('*B`\``'4RF$`_>8@!N6`*7,(``>&+`<`K`(``"``#&``P
  206. XM`\X([``'``Q@``/$".P`!@`.8``#N@CL``<`#F```[``K"```"``#&```Z1*)
  207. XM*@`!9Q!!Z@`!0^P`(&$`\<8J!&`L+@92AR`M_^BPAVP.&5('*B`\``'4RF$`9
  208. XM_70@!N6`(',(`$/L`"!A`/&8+`<([``$``]@``-8".P`!0`-8``#3DHJ``%G8
  209. XM,D'J``%#[`O<80#\T$J`9AXB;P`<(%'1Q4/H``%P_R!)80#C$"`L`"1R%&$`2
  210. XMXI0J!&!$+@92AR`M_^BPAVP.&5('*B`\``'4RF$`_/P@!N6`)$O5P"!20^P+E
  211. XMW&$`_'Y*@&82</\@4F$`XLH@+``D<A1A`.).+`<([``#``U@``+(2BH``6<R=
  212. XM0>H``4/L"]!A`/Q*2H!F'B)O`!P@4='%0^@``7#_($EA`.**("P`)'(480#BI
  213. XM#BH$8$0N!E*'("W_Z+"';`X94@<J(#P``=3*80#\=B`&Y8`D2]7`(%)#[`O0'
  214. XM80#[^$J`9A)P_R!280#B1"`L`"1R%&$`X<@L!PCL``(`#6```D(`K```""``L
  215. XM#&```C:3R2QX``1.KO[:($`A;`OP`+A@``(@*7Q_____`"`([``$``]@``(.6
  216. XM".P``0`-8``"!`CL``4`#F```?H`K$```"``#&```>X([``#`!-@``'D2BH`T
  217. XM`6<00>H``4/L`#!A`/`&*@1@+"X&4H<@+?_HL(=L#AE2!RH@/``!U,IA`/NTM
  218. XM(`;E@"!S"`!#[``P80#OV"P'("P`,'(,L(%M"@R````!+&\``8Y"K``P8``!X
  219. XMADHJ``%G$$'J``%#[``L80#OJ"H$8"PN!E*'("W_Z+"';`X94@<J(#P``=3*T
  220. XM80#[5B`&Y8`@<P@`0^P`+&$`[WHL!PRL````!``L;``!.$*L`"Q@``$P`*P`4
  221. XM`(`"``Q@``$D".P`!@`-8``!&@CL``(`$V```1!P4-"`@:P`#&```00(K``#T
  222. XM``]@``#Z&7P`90;P8```\`BL``(`#V```.8([`````Q@``#<".P`!P`-8```8
  223. XMTG`#*4`,(`CL``4`#&```,(([``%``]@``"X".P`!``-8```K@CL``8`#V``=
  224. XM`*0([``!``Q@``":".P`!``,8```D`CL``4`$V```(8([``!``Y@?'`!*4`,*
  225. XM(&!T<`(I0`P@8&P([``"``Q@9$HJ``%G#$'J``$I2!+T*@1@)BX&4H<@+?_H-
  226. XML(=L#AE2!RH@/``!U,IA`/HZ(`;E@"ES"``2]"P'".P`!``.8"0([``&`!-@\
  227. XM''``$!)R,)"!*4``&&`.&5('*B`\``'4P&$`^@)2A;J$;0#ZKB`&3-],\$Y=<
  228. XM3G5.5?]L2.<A,BM(_W"3R2QX``1.KO[:)D`I:P"X"_!P_R=``+A(;?]X(&W_`
  229. XM<$/M_W1A`/B<6$\L;!0X3J[_RBE`"^Q.KO_$*4`+Z"(`3J[_*$J`9Q0@+`OL@
  230. XM(@!.KO\H2H!G!@CL``$`#R`\```!!$ZZ`Z`I0``$9@IP9T'L!R=A`-]:<"1.7
  231. XMN@.**4``"&8*<&=![`<G80#?1'X!<``I0`P`*4`+]"E`"_PI0`OX*4`,""E`L
  232. XM#`0@:P"80^P,B$ZZ"FR^K?]T;'`@!^6`0>W_>-'`(E!P+;`19EYP`L"L``P`N
  233. XM0``,*4``#$*L`!!![`7B*4@'ABE\?____P`@(`?E@$'M_W@B2-/`)%%**@`!J
  234. XM9@12AV`D(`<B+?]T80#Y5BX`OJW_=&P2(`?E@$'M_WC1P")0<"VP$6?$("P`S
  235. XM$`)`__X"0/_]`D#_[RE``!!P`!E`$`P90`[@OJW_=&P``3X([`````X@!^6`Y
  236. XM0>W_>-'`+T@`%$'L#;0B;P`4(E%.N@M\4H=![`VT3KH&JDJ`9UI![!`,0^P-E
  237. XMM$ZZ"3!![`[@0^P0#$ZZ"U9![`VT(DA.N@C<0>P-M$ZZ!GQ*@&<60>P.X$/L1
  238. XM#;1.N@D"0>P-M")(3KH(N@@L``,`$V8:".P``@`.".P````38`P(K``"``X(#
  239. XMK````!-![`[@3KH*R'(?L(%N#D'L$`Q.N@JZ<A^P@6\@(#P``=340>P')V$`9
  240. XMW<`(+``%`!-G``',<'AR%&$`W3Q![`VT3KH%_$J`9R@@!^6`0>W_=-'`(#P`O
  241. XM`=3>(%!A`-V,""P`!0`39P`!F'!X<A1A`-T(0>P-M"((=/XL;!0X3J[_K"E`K
  242. XM``!F)G#_0>P-M&$`W5H(+``%`!-G``%F("P`)'(480#<U&`&*6L`F```<#I!?
  243. XM[`VT3KH(<DJ`9@P@;```0^P-M$ZZ"'1![`VT*4@2\!`L#N!*`&8,<BH900[@6
  244. XM<``90`[A$"P0#$H`9@IR*AE!$`Q"+!`-$"P0#'(NL`%G$!`L#N"P`6<($"P-:
  245. XMM+`!9@8([``&``T@+``<L*P`(&<,(&P``$/L#;1A`/(T2JP``&<6""P````.G
  246. XM9PX@+```(@`L;!0X3J[_ID*L``!A`.4@""P````/9@``J+ZM_W1L(`@L``8`Q
  247. XM#F88""P``0`39A`(+``$`!-F"$'L!R9A`.3(OJW_=&UZ""P`!0`.9W(@+`OT:
  248. XM<@&P@6=H2JP,`&=B2H!G.D'L!OYA`.7"0>P&=V$`Y'!![`;Q80#ELB\L#`@O[
  249. XM+`P$+RP+_"\L"_A(;`8.2&P1.$ZZ`(9/[P`88!PO+`P(+RP,!"\L"_Q(;`9#:
  250. XM2&P1.$ZZ`&A/[P`40>P1.&$`Y"*^K?]T;`H(+`````]G`/S"<``B`&$`VV),4
  251. XMWTR$3EU.=4CG(`)8@"0`<@`L>0````1.KO\Z2H!G!BQ`+,(@#DS?0`1.=2\.H
  252. XM0^C__"`1+'D````$3J[_+BQ?3G5.50``2.?@\B!M``Q#[0`01?D``"9N)FT`9
  253. XM""QY````!$ZN_?9,WT\'3EU.=1;`3G5.5?_42.<X(BM(__@K2?_\+&P4.$ZN@
  254. XM_\HB`$ZN_RA*@&<H3J[_Q"(`3J[_*$J`9QJ3R2QY````!$ZN_MH@0"MH`*3_E
  255. XM]$JM__1F"'(7=$U@``%$>`!P`"!`3KD``"AR*T#_[&<``3QP1$ZY```F""M`R
  256. XM__!G``"$)&W_[")`(&W_]'`!3KD``"@:+&P4.$ZN_\0B`'8$0>P'(B0(+&P4?
  257. XM.$ZN_]`,@`````1F```L)#P``"<03J[_RB(`3J[_-$J`9P``%DZN_\HB`'80&
  258. XM0>W_V"0(3J[_UB@`)&W_[")M__`@;?_T<`!.N0``*!H@+?_P9P@@0$ZY```F5
  259. XM+"`M_^QG``"B3KD``"C\#(0````);P``DD7M_]@,*@`[``1F``"$##(`<D#_)
  260. XM9@``>EI*<@`2&@1!`#`,$@`[9QK"_``*TAH$`0`P#!(`.V<*POP`"M(:!`$`=
  261. XM,%)*=``4&@P"`"!G``!"#`(`.V<``#H,`@!R9P``,@0"`#`,$@`@9QK$_``*'
  262. XMU!H$`@`P#!(`(&<*Q/P`"M02!`(`,"!M__P@@2!M__@@@DS?1!Q.74YU2.<`P
  263. XM-B9(*DE![0`4*T@`"D'M```K2``4*TH`&"M\```#X@`<2D!G```,*WS_____@
  264. XM`"A@!$*M`"@@2R)-+'D````$3J[^DB!*3J[^@"!*3J[^C$S?;`!.=4CG!28JD
  265. XM2"H`</\L>0````1.KOZV#(#_____9@9P`&```&0N`'`B3KD``"8(2H!F#"`'Z
  266. XM3J[^L'``8```2B1`)4T`"A5%``D5?``$``@5?`````X51P`/D\E.KO[:)4``#
  267. XM$+O\`````&<*(DI.KOZ>(`I@$D'J`!0@B%B00J@`!"%(``@@"DS?9*!.=4CG1
  268. XM``8J0"QY````!$JM``IG!B)`3J[^F!M\`/\`""M\_____P`4<``0+0`/3J[^&
  269. XML"!-3KD``"8L3-]@`$YU3E4``$CG'S(F22)(?DXJ$6T``,"*_`6U(`5(Q>6-8
  270. XMWH5(0#H`2D5G&#P\`6TP!P)```-F`E)&ND9M!II&4H=@Y'@`?`!214'L!=8<T
  271. XM,$``#$0``68*,`<"0``#9@)21KI&;PJ:1E)$#$0`#&W>#(<```!C;P@$AP``[
  272. XM`&1@\"`I``B`_``R2,`O`"`I``0B`(#\`#QV`#8`P/P`/))`+P$O`TAL!<0O5
  273. XM+0`(3KD``"9"3^\`%"\%4D0O!"\'2&P%LB\+3KD``"9"3^\`%$S?3/A.74YUL
  274. XM0^P%J2!M``A.N0``+O!#[`6@($M.N0``+O!@W'``$!AG#@P``"IG!@P``#]F8
  275. XM\'`!3G5.5?_`2.<P,"0L``PD2"9)0>W_P$/M_\1V`$H29@9*$V<``)X,$P`J5
  276. XM9D(,0P!`9P``E"&+,``CBC``4$-22V#:44,@"$I#;0P@<3@`2A!F!%%#8/!*2
  277. XM0VUL($`F<#``4DM2L3``)'$X`%!#8*X,$P`_9@I*$F8Z2D-G2F#$$!(2$P@"]
  278. XM`!5G(`P``$!C"@P``%IB!`8``"`,`0!`8PH,`0!:8@0&`0`@L@!G!DI#9Q9@^
  279. XMD$H29P)22DH39P922V``_UQP`6`"<`!,WPP,3EU.=4CG,"`D`"8L``P(`P`1D
  280. XM9R(@*``$L*D`!&T&9Q9P`&`"<`$(`P`09P``G@A```!@``"6"`,`!F8``()*&
  281. XM0F9`0>@`"$/I``A*$&<N$AD0&`@#`!1G(`P!`$!C"@P!`%IB!`8!`"`,``!`O
  282. XM8PH,``!:8@0&```@L@!GSI`!;CI@/%-"9@X@*`!\L*D`?&TJ;BQ@KE-"9A9!.
  283. XMZ`"$0^D`A$ZY```KV$J`;1!N$F"4("@``+"I``!GBFT$<`%@`G``"`,`"6<$F
  284. XM"$```$S?!`Q.=2`H``"0J0``9A0@*``$D*D`!,'\"[C0J``(D*D`"$YU2.<@=
  285. XM-B0L#"`F2"1)*FL``$JM``!G&B)J``@@;0`((`).N0``*PQ*0&8&*FT``&#@P
  286. XM($LB2B1M``0L>0````1.KO\63-]L!$YU2.<`-B1()DE.N0``"=Y*@&<D*D`@1
  287. XM/````00B;0`(($LL>0````1.KOV0(DT@2DZY```K^'`!3-]L`$YU<`!.=2\*O
  288. XM<``D24H99OP2(0P!`#IG'`P!`"]F$+/*9Q(,*0`O__]G"E-)8`:SRF+>8`JSV
  289. XMRF4&$-I20&#V0A`D7TYU+PIP`"1)2AEF_!(A#`$`.F<,#`$`+V<&L\IB[F`"_
  290. XM4DD0V6<$4D!@^"1?3G53@&T$$-EF^$(0(`A.=;/(90S0P-+`$R!30&[Z8`82;
  291. XMV%-`;OI.=;`09PI*&&<"8/9P`$YU(`A.=4CG/3(F""1)0A)Z`"`\```!!$ZYU
  292. XM```F""X`9P``E"QL%#A*@V=.(@,D!TZN_YI*@&=^(D<,*0`@``AE'DH29PQ#L
  293. XM[`:#($I.N0``+>XB1T/I``@@2DZY```M[B@#(@-.KO\N)@!*168$>@%@MB($Y
  294. XM3J[_IF"N(D<,*0`@``AD#D/L!H4@2DZY```M[F`J<"\@2DZY```M$$J`9P@@=
  295. XM0!"\`#I@%$/L!H$@2DZY```NX&`&0A)V`&`"=@%*AV<(($=.N0``)BP@`TS?&
  296. XM3+Q.=4CG`3`F221(($M.N0``+K@N`"!*3KD``"ZX4D`B2M+'($I.N0``+/@P_
  297. XM!R)*($M.N0``+/A,WPR`3G4,``!A;0H,``!Z;@0$```@3G4``$Y5__Q(YP,P&
  298. XM)D@D22X`2H=G,DH39RY*$F<J<``0&TZZ_\QR`!(:+T``$"`!3KK_OB(O`!"2V
  299. XM@"P!2H9G!"`&8!I3AV#*2H=G$$H39P1P`6`*2A)G!'#_8`)P`$S?#,!.74YUD
  300. XM```B"&`$$-EG"%.`9/A@!D(84X!D^B`!3G4@"$H89OQ32)'`(`A.=0``$ABR)
  301. XM&68(2@%F]G``3G5N!'#_3G5P`4YU(`A*&&;\4X@0V6;\3G4``$CG`#`F2"1)(
  302. XM$!H6@$H`9P12BV#T(`M,WPP`3G5.5?_X2.<!,"9()$E^`$H39RHK2O_\(&W_(
  303. XM_$H09PP0$+`39P92K?_\8.P@;?_\2A!F!"`'8`A2AU*+8-(@!TS?#(!.74YUN
  304. XM3E7_^$CG`3`F2"1)?@!*$V<B*TK__"!M__Q*$&<0$!"P$V8$(`=@#E*M__Q@^
  305. XMZ%*'4HM@VB`'3-\,@$Y=3G5(YP`P)D@D22!+(DIA`/]N3-\,`$YU2.<`,"9(*
  306. XM)$D@2R)*89Y,WPP`3G4``$CG`Q`N`$?L"UP@"V<P""L``@`;9B0(*P`!`!MG9
  307. XM'"`K``20JP`0+`!*AF<.("L`'"(&(&L`$$ZZ_(@F4V#,(`=.N@#V3-\(P$YU=
  308. XM``````````!P84CG,``D`"8!2$)(0\3!QL#`P=1#2$)"0M""3-\`#$YU2H!J!
  309. XM```>1(!*@6H```Q$@6$``"!$@4YU80``&$2`1(%.=4J!:@``#$2!80``!D2`G
  310. XM3G4O`DA!-`%F```B2$!(04A"-`!G```&A,$P`DA`-`"$P3`"2$(R`B0?3G4O3
  311. XM`W80#$$`@&0```;AF5%##$$(`&0```;IF5E##$$@`&0```;EF55#2D%K```&4
  312. XMXYE30S0`YJA(0D)"YJI(0X#!-@`P`C0#2$'$P9""9```"%-#T(%D_G(`,@-(A
  313. XM0^>X2$#!028?)!].=4CG!P`N`"`L"UA3@"P`2D9K+B`&2,#G@$'L$O@J,`@`@
  314. XM2@5G&`@%``1F$B`&2,#G@$'L$O@@,`@$3KK[3E-&8,X@!TZZS^1,WP#@3G4`'
  315. XM```````````````@B%B00J@`!"%(``A.=0``(`@0V6;\3G4```/L````(0``X
  316. XM`````"X$```M^@``+<P``"Q*```J(@``*A8``"X>```N$@``+>(``"VT```M]
  317. XMJ```+7@``"UJ```M-@``+'```"P:```KJ@``*?P``"GD```I,```*)H``"=TF
  318. XM```G9@``)U@``";V```FW```)LP``"94````V@```1````#R```!!@```20`?
  319. XM```!`````0````8````````#\@```^H```,7````````````````````#```0
  320. XM``````````````````!_____`````````````````````)LS,VUL<R!V-"XPQ
  321. XM:YLP;2`@J2!#;W!Y<FEG:'0@($MI;2!%+B!$959A=6=H;B`@,#4O,3$O.3`@Y
  322. XM(%MN;VXM:R!R979S.B!*+B!-8T-O<FUI8VM="@!U<V%G93H@;',@6R!;+6]P?
  323. XM=&EO;G,@/&%R9W,^72`@6VYA;65S72!=("XN+@H`("!A("!3:&]W(&1O="!F]
  324. XM:6QE<R`@("`@("!S("!3;W)T(&)Y('-I>F4@("`@("`@("`@($T@($EG;F]RJ
  325. XM92!C87-E('<O=VEL9&-A<F0*`"`@8B`@4VAO=R!D871A(&)L:W,@("`@("`@D
  326. XM="`@4V]R="!B>2!D871E("`@("`@("`@("!.(#QN86UE/B!3:&]W(&YE=V5R`
  327. XM('1H86X*`"`@8R`@4VAO=R!F:6QE;F]T97,@("`@("`@=2`@57-A9V4@(%MA(
  328. XM;'-O("T_72`@("`@("!/(#QN86UE/B!3:&]W(&]L9&5R('1H86X*`"`@9"`@1
  329. XM4VAO=R!D:7)S(&]N;'D@("`@("`@=B`@5F%R:2!C;VP@<VAO<G0@;&ES="`@'
  330. XM("!0("!3:&]W(&9U;&P@<&%T:&YA;65S"@`@(&4@($5X96-U=&4@8FET(&ES"
  331. XM(")E(B`@('@@/'!A=#X@17AC;'5D92!F:6QE<R`@("`@42`@4F5Q=65S=&5R.
  332. XM<R!E;F%B;&5D"@`@(&8@(%-H;W<@9FEL97,@;VYL>2`@("`@('H@($]V97)R,
  333. XM:61E(&)L:R!C86QC("`@("`@4B`@4F5C=7)S:79E(&QI<W1I;F<*`"`@:"`@4
  334. XM4VAO=R!H:61D96X@9FEL97,@("`@02`@4VAO=R!A;&P@(%L]("UA:&E=("`@O
  335. XM("!3("!3:&]W(&1I<G,@9FER<W0*`"`@:2`@4VAO=R`J+FEN9F\@9FEL97,@9
  336. XM("`@0B`\8FQK/B!&;W)C92!B;&L@<VEZ92`@("!4("!4;W1A;',@9F]R(&%L7
  337. XM;"!E;G1R:65S"@`@(&L@(%-O<G0@8GD@9&ES:R!K97D@("`@($,@(%-I;F=LR
  338. XM92!C;VQU;6X@;&ES="`@("`@5B`@4VAO=R!R96P@<&%T:&YA;65S"@`@(&P@@
  339. XM($QO;F<@;&ES=&EN9R`@("`@("`@($0@(%-H;W<@9&ER<R!L87-T("`@("`@U
  340. XM("`@5R`@3F\@8V]N=&5N=',@*'=I;&0@9&ER*0H`("!M("!-:7AE9"!C87-EL
  341. XM(&]U='!U="`@("!%("!.;R!!3E-)(&5S8V%P92!C;V1E<R`@(%@@/'=I9&4^8
  342. XM(%-E="!O=71P=70@8V]L<PH`("!N("!.;R!S;W)T("`@("`@("`@("`@("!'2
  343. XM("!.;R!S=6)D:7(@=&]T86QS("`@("`@(%D@/&AI9V@^(%-E="!O=71P=70@-
  344. XM<F]W<PH`("!O("!/;&0@;&]N9R!L:7-T(&9M="`@("!(("!.;R!H96%D:6YGK
  345. XM<R`@("`@("`@("`@(%H@($9O<F-E($%.4TD@<V5Q=65N8V5S"@`@('`@($%P>
  346. XM<&5N9"`B+R(@=&\@9&ER<R`@($D@($YO('!A9V4@<')O;7!T<R`@("`@("`PW
  347. XM+38@1&%T92!F;W)M870@*&YE=R!L;VYG*0H`("!Q("!1=6ET(&]N(&YO="!F'
  348. XM;W5N9"`@("!+("!3:&]W(&1I<VL@:V5Y<R`@("`@("`@("T@($YE>'0@87)G/
  349. XM(&ES(&9I;&5N86UE"@`@('(@(%)E=F5R<V4@<V]R="`@("`@("`@($P@/&X^1
  350. XM($QI;6ET960@<F5C=7)S:6]N"@`@($8@/&9O<FUA=#X@1F]R;6%T(&]U='!U[
  351. XM="!;+6\@9FUT72`H9&5F875L=#H@(@`B*0H`,#`M,#`M,#``,#`Z,#`Z,#``;
  352. XM)3`R;&0M)3`R;&0M)3`R;&0`)3`R;&0Z)3`R;&0Z)3`R;&0`'QP?'A\>'Q\>I
  353. XM'QX?)7`@)60@)70@)31B("4X<R`E;EQN`````````````````````````"5LL
  354. XM9`!$:7)S.B`E+31L9"!&:6QE<SH@)2TU;&0@0FQO8VMS.B`E+35L9"!">71E-
  355. XM<SH@)2TX;&0*`"`@("`@("`@("`@1FEL97,Z("4M-6QD($)L;V-K<SH@)2TU4
  356. XM;&0@0GET97,Z("4M.&QD"@`*5&]T86QS.@H`.@`O`%)!33H```!*86X`1F5BC
  357. XM`$UA<@!!<'(`36%Y`$IU;@!*=6P`075G`%-E<`!/8W0`3F]V`$1E8P````:*\
  358. XM```&C```!I````:4```&F```!IP```:@```&I```!J@```:L```&L```!K0`B
  359. XM``:X>)LP;0";,"!P`)L@<`";,S-M`)LQ.S,S.S0P;0";,3LS,3LT,&T`FS<[?
  360. XM,S-MFS`@<`";,"!Q"@`````````````T````B0```+<```$&```!5````:(`'
  361. XM``'N```".0```H,```++```#&@```V4```.T```$`@``!%````2=```$[```C
  362. XM!3D```5L```%X@``!9P````````%XCH`;',Z($]U="!O9B!M96UO<GD*```EF
  363. XM<SH@1FEL92!O<B!D:7)E8W1O<GD@:6X@=7-E"@`E<SH@3F\@<W5C:"!F:6QES
  364. XM(&]R(&1I<F5C=&]R>0H``"!&:6QE<WES=&5M(&YO="!V86QI9&%T960*```@N
  365. XM1&5V:6-E(&YO="!M;W5N=&5D(&]R(&%S<VEG;F5D"@``($EN=F%L:60@9FEL8
  366. XM97-Y<W1E;2!F;W)M870@6VYO;BU$3U-="@`@1&5V:6-E(&5M<'1Y"@``;',Z5
  367. XM($1I<F5C=&]R>2!O<B!F:6QE;F%M92!P871T97)N('1O;R!L;VYG"@`E<SH@3
  368. XM56YA8FQE('1O('!A='1E<FX@;6%T8V@@<&%T:',*``!L<SH@)7,Z($5R<F]RD
  369. XM("T@)6QD"@``)7,@)3)L9"`E-6QD```E<R`E,FQD("4P,FQD.B4P,FQD````\
  370. XM)7,@)3`R;&0@)31L9"`@)3`R;&0Z)3`R;&0Z)3`R;&0``"4P,FQD+25S+24PO
  371. XM,FQD("4P,FQD.B4P,FQD.B4P,FQD```E,#)L9"TE,#)L9"TE,#)L9"`E,#)L-
  372. XM9#HE,#)L9#HE,#)L9````"4P,FQD+R4P,FQD+R4P,FQD("4P,FQD.B4P,FQDQ
  373. XM.B4P,FQD````)3`R;&0O)3`R;&0O)3`R;&0@)3`R;&0Z)3`R;&0Z)3`R;&0`-
  374. XM```E,#)L9"XE,#)L9"XE,#)L9"`E,#)L9#HE,#)L9#HE,#)L9``````````*$
  375. XM;',Z('=A<FYI;F<@*"5L9"DZ(&)L;V-K(&-O=6YT*',I(&UA>2!B92!I;F%C0
  376. XM8W5R871E("T@<V5E(&QS+F1O8PH*`"`@```@8P``("4V;&0`("4U;&0@)3ALF
  377. XM9"`@```@(```+P`O``H`(B5S(@H`FS!MFR!P*BI"4D5!2PH``"!-;W)E("@EX
  378. XM;&0@;V8@)6QD*2`N+BX@`$UO<F4@+BXN(`";,"!PFT:;2P``(``O*B`E<R`J'
  379. XM+PH`8VAS<&%R=S=D`#``,0!$:7(`*BYI;F9O```N*@``3F\@;6%T8V@N"@``*
  380. XM=&]T86P@,`H``&QS.B!$979I8V4@96UP='D@;W(@;F]T(&UO=6YT960*``!L:
  381. XM<SH@17AA;6EN92!F86EL960@+2!);T5R<B`E;&0*`#H*``!L<SH@:6QL96=AQ
  382. XM;"!O<'1I;VX@+2T@)7,@("`@6RUU(&9O<B!U<V%G95T*`&QS.B!R97%U:7)E-
  383. XM9"!A<F<@;6ES<VEN9R!O;B!O<'1I;VX@+2T@)7,@("`@6RUU(&9O<B!U<V%GT
  384. XM95T*````````*```"WX`````````````````````````````````````````]
  385. XM``N@````````````````````````````````````````````````````````K
  386. XM````````````````````````````````````)0``!X8```=^```'>@``!W8`U
  387. XM``=R```';@``!VH```=F```'8@``!UX```=:```'5@``!U(```=.```'2@``7
  388. XM!T8```="```'/@``!SH```<V```',@``!RX```;L```&Z```!N0```;@```&]
  389. XMW```!M@```;4```&T```!LP```;(```&Q```!L````:\```+?@``"UP```/L[
  390. X(`````````_+4)
  391. X``
  392. Xend
  393. Xsize 16028
  394. END_OF_FILE
  395. if test 22474 -ne `wc -c <'ls.uu'`; then
  396.     echo shar: \"'ls.uu'\" unpacked with wrong size!
  397. fi
  398. # end of 'ls.uu'
  399. fi
  400. if test -f 'src/ls.c.ab' -a "${1}" != "-c" ; then 
  401.   echo shar: Will not clobber existing file \"'src/ls.c.ab'\"
  402. else
  403. echo shar: Extracting \"'src/ls.c.ab'\" \(20364 characters\)
  404. sed "s/^X//" >'src/ls.c.ab' <<'END_OF_FILE'
  405. X
  406. XGOODRET:
  407. X  FreeAllFibs (fibhead);
  408. X  return (dirhead);
  409. X
  410. XBADALLOC:
  411. X  FreeAllFibs (fibhead);
  412. X  FreeAllFibs (dirhead);
  413. X  return (0L);
  414. X}
  415. X
  416. X
  417. X/* --------------------------------------------------------------------
  418. X * Given a directory name and a lock on that directory, create a list
  419. X * of entries.    Recursively decends into subdirectories if flaged.
  420. X * -------------------------------------------------------------------- */
  421. XVOID DirIt (curlock, dirname)
  422. X  struct FileLock *curlock;
  423. X  BYTE *dirname;
  424. X{
  425. X  BYTE *matchpath;
  426. X  BYTE *subdir;
  427. X  LONG dnamlen;
  428. X  LONG errcode;
  429. X  LONG len;
  430. X  LONG tmpflags;
  431. X  BYTE tmpdpat[MAXFNLEN+2];
  432. X  BYTE tmpfpat[MAXFNLEN+2];
  433. X  struct FibEntry *tfibp;
  434. X  struct FileLock *sublock;
  435. X  struct List *fibheadp;
  436. X
  437. X/* Try to fill FileInfoBlock, bomb if not readable for some reason */
  438. X  if (Examine((BPTR)curlock, GFibp) == 0)
  439. X  {
  440. X    if ((errcode = IoErr()) == ERROR_DEVICE_NOT_MOUNTED)
  441. X      asprintf(workstr, "ls: Device empty or not mounted\n");
  442. X    else
  443. X      asprintf(workstr, "ls: Examine failed - IoErr %ld\n", errcode);
  444. X    WSTR(workstr);
  445. X    return;
  446. X  }
  447. X
  448. X  recurlevel++;
  449. X
  450. X/* Put directory header for each listing, if headers on and we know the name */
  451. X  if ((GFibp->fib_DirEntryType > 0) && ((LSFlags & NOHEADERS) == 0) && (dirname[0] != 0))
  452. X  {
  453. X  /* Put directory header for each listing, if    recursive and not top dir */
  454. X    if ((recurlevel > 1) && (strcmp(dirname, thePath) != 0))
  455. X    {
  456. X      strcpy(workstr, dirname);
  457. X
  458. X      len = 0;
  459. X      if ((LSFlags & FULLPATHNAMES) == 0)
  460. X      {
  461. X    if ((strnicmp(initialpath, thePath, strlen(thePath)) == 0) ||
  462. X        (strnicmp(thePath, initialpath, strlen(initialpath)) == 0))
  463. X    {
  464. X      if (strlen(thePath) <= strlen(initialpath))
  465. X        matchpath = thePath;
  466. X      else
  467. X        matchpath = initialpath;
  468. X      len = strlen(matchpath);
  469. X      if ((strnicmp(workstr, matchpath, len) == 0) && (len < strlen(workstr)))
  470. X      {
  471. X        if (*(workstr + len) == '/')
  472. X          len++;
  473. X      }
  474. X      else
  475. X        len = 0;
  476. X    }
  477. X      }
  478. X      strcat(workstr, ":\n");
  479. X
  480. X      SetConPen(penstr3);
  481. X      WSTR(workstr + len);
  482. X      SetConPen(penstr0);
  483. X    }
  484. X  }
  485. X
  486. X/* If this is a single file list it verbosely */
  487. X  if (GFibp->fib_DirEntryType < 0)
  488. X  {
  489. X    if ((LSFlags & SHOWFILES) != 0)
  490. X    {
  491. X      GetPathString(thePath, thePath);
  492. X      fixNumBlocks(curlock, GFibp);
  493. X
  494. X      if ((LSFlags & OLDLONGFORMAT) != 0)
  495. X    LListEntry(GFibp);
  496. X      else
  497. X    llistentry(GFibp);
  498. X
  499. X      gfilecount++; gitemcnt++;
  500. X      gtotblocks += blkalloc(GFibp);
  501. X      gtotbytes  += GFibp->fib_Size;
  502. X
  503. X      LSFlagsX |= SINGLEFILEFLAG;
  504. X    }
  505. X  }
  506. X  else /* It is a directory entry */
  507. X  {
  508. X    tmpflags = LSFlags;
  509. X    if ((LSFlags & WILDPATH) != 0)
  510. X      LSFlags |= SEPFILESDIRS | FILESFIRST;
  511. X
  512. X  /* Allocate, fill, and display a dir of entries, check for no ram or abort */
  513. X    if ((fibheadp = GetDir (curlock, GFibp)) != 0)
  514. X    {
  515. X
  516. X    /* Recursively descend any subdirs in this list, if wanted or a wild path */
  517. X      LSFlags = tmpflags;
  518. X      if (((LSFlags & LISTALL) != 0) || ((LSFlags & WILDPATH) != 0))
  519. X      {
  520. X    LSFlags &= ~WILDPATH;
  521. X    for (tfibp = (struct FibEntry *)fibheadp->lh_Head;
  522. X          tfibp->fe_Node.mln_Succ != 0;
  523. X          tfibp = (struct FibEntry *)tfibp->fe_Node.mln_Succ)
  524. X    {
  525. X      TestBreak ();
  526. X      if ((LSFlags & BREAKFLAG) != 0)
  527. X        break;
  528. X
  529. X      if (tfibp->fe_Fib->fib_DirEntryType > 0)
  530. X      {
  531. X      /* Alloc length of path + 1 + newdir name +1 + length of maxname + 1 for NULL
  532. X       * + 1 for null + 3 for rounding.
  533. X       */
  534. X        dnamlen = (LONG)(strlen (dirname) + strlen (tfibp->fe_Fib->fib_FileName) + 36);
  535. X        if ((subdir = myalloc ((LONG)dnamlen)) != 0)
  536. X        {
  537. X          if (dirname[0] != 0)
  538. X          {
  539. X        (VOID) stpcpy (subdir, dirname);
  540. X        dnamlen = strlen (dirname) - 1;
  541. X        if (dirname[dnamlen] != ':' && dirname[dnamlen] != '/')
  542. X        {
  543. X          (VOID) strcat (subdir, SlashStr);
  544. X        }
  545. X          }
  546. X          (VOID) strcat (subdir, tfibp->fe_Fib->fib_FileName);
  547. X
  548. X          if ((recurlevel != recurlimit) &&
  549. X          ((sublock = (struct FileLock *)Lock(subdir, (LONG)ACCESS_READ)) != 0))
  550. X          {
  551. X        if ((LSFlags & NOHEADERS) == 0)
  552. X          WCHR(NLine);                  /* Put a blank line between directories */
  553. X
  554. X        curpath = subdir;
  555. X
  556. X        if ((LSFlagsX & WILDPATHFLAG) != 0)
  557. X        {
  558. X          strcpy(tmpdpat, theDirPat);
  559. X          theDirPat[0] = '*'; theDirPat[1] = '\0';
  560. X          strcpy(tmpfpat, theFilePat);
  561. X          theFilePat[0] = '*'; theFilePat[1] = '\0';
  562. X        }
  563. X
  564. X        DirIt(sublock, subdir); /* Recurse into this subdirectory */
  565. X
  566. X        if ((LSFlagsX & WILDPATHFLAG) != 0)
  567. X        {
  568. X          strcpy(theDirPat, tmpdpat);
  569. X          strcpy(theFilePat, tmpfpat);
  570. X        }
  571. X
  572. X        UnLock((BPTR)sublock);  /* Unlock our sublock */
  573. X          }
  574. X          myfree(subdir);           /* Free the current namespace */
  575. X        }
  576. X      }
  577. X    }
  578. X      }
  579. X      LSFlags = tmpflags;
  580. X    /* Free up this fib list */
  581. X      FreeAllFibs(fibheadp);
  582. X    }
  583. X    LSFlags = tmpflags;
  584. X  }
  585. X  recurlevel--;
  586. X}
  587. X
  588. X
  589. X/* -------------------------------------------------------------------- */
  590. XVOID GetCLIArgs (line, argc, argv)
  591. X  BYTE *line;
  592. X  LONG *argc;
  593. X  BYTE **argv;
  594. X{
  595. X  BYTE **pargv, *qarg;
  596. X
  597. X  *argc = 0;
  598. X  while (*argc < MAXARG)
  599. X  {
  600. X    while (*line == ' ' || *line == '\t' || *line == '\n')
  601. X      line++;
  602. X    if (*line == 0)
  603. X      break;
  604. X    pargv = &argv[*argc];
  605. X    *argc += 1;
  606. X
  607. X    if (*line == '"')
  608. X    {
  609. X      qarg = line;
  610. X      line += 1;
  611. X      *pargv = line;             /* ptr inside quoted string */
  612. X      while (*line != 0 && *line != '"')
  613. X    line++;
  614. X      if (*line == 0)                /* Hit end of string without quote! */
  615. X      {
  616. X    *pargv = qarg;             /* Must be okay */
  617. X    break;
  618. X      }
  619. X      else
  620. X    *line++ = 0;             /* terminate arg ontopof quote */
  621. X    }
  622. X    else                 /* non-quoted arg */
  623. X    {
  624. X      *pargv = line;
  625. X      while (*line != 0 && !(*line == ' ' || *line == '\t' || *line == '\n'))
  626. X    line++;
  627. X      if (*line == 0)
  628. X    break;
  629. X      else
  630. X    *line++ = 0;             /* terminate arg */
  631. X    }
  632. X  }                     /* while */
  633. X}
  634. X
  635. X
  636. X/* -------------------------------------------------------------------- */
  637. XLONG GetFileDate(name, ptime)
  638. X  char *name;
  639. X  struct DateStamp *ptime;
  640. X{
  641. X  LONG status;
  642. X  struct FileLock *flock;
  643. X  struct FileInfoBlock *fib;
  644. X
  645. X  status = 0;
  646. X  if ((fib = myalloc ((LONG)sizeof(struct FileInfoBlock))) != 0)
  647. X  {
  648. X    if ((flock = (struct FileLock *)Lock(name, (LONG)ACCESS_READ)) != 0)
  649. X    {
  650. X      if (Examine((BPTR)flock, fib) != 0)
  651. X      {
  652. X    *ptime = fib->fib_Date;     /* Copy the Date structure */
  653. X    status = 1;
  654. X      }
  655. X      UnLock((BPTR)flock);
  656. X    }
  657. X    myfree(fib);
  658. X  }
  659. X  return(status);
  660. X}
  661. X
  662. X
  663. X/* --------------------------------------------------------------------
  664. X * Trap for bad args, and/or explain how to use.
  665. X * -------------------------------------------------------------------- */
  666. XVOID Usage(errcode)
  667. X  LONG errcode;
  668. X{
  669. X  LONG i;
  670. X
  671. X  switch(errcode)
  672. X  {
  673. X    case ILLEGAL_ARG:
  674. X      asprintf(workstr, "ls: illegal option -- %s    [-u for usage]\n", badopt);
  675. X      break;
  676. X    case MISSING_ARG:
  677. X      asprintf(workstr, "ls: required arg missing on option -- %s    [-u for usage]\n", badopt);
  678. X      break;
  679. X    default:
  680. X      for (i = 0; ((LSFlags & BREAKFLAG) == 0) && (usagestrs[i] != 0); TestBreak(), i++)
  681. X    WSTR(usagestrs[i]);
  682. X      cleanup(0, 0);
  683. X  }
  684. X  WSTR(workstr);
  685. X  cleanup(120L, 20L);
  686. X}
  687. X
  688. X
  689. X/* -------------------------------------------------------------------- */
  690. XLONG ParseCmdOptions(ncnt, argc, argv)
  691. X  LONG ncnt, argc;
  692. X  BYTE **argv;
  693. X{
  694. X  LONG i, cnt, len;
  695. X  struct Process *procp;
  696. X
  697. X  cnt = ncnt;       /* Current arg number that contains the options */
  698. X  ncnt += 1;       /* Advance to next arg */
  699. X
  700. X  for (i = 1, len = strlen (argv[cnt]); i < len; i++)
  701. X  {
  702. X    switch (argv[cnt][i])
  703. X    {
  704. X      case '?':
  705. X      case 'u':
  706. X    Usage(SYNTAX);
  707. X    break;
  708. X      case 'A':
  709. X    LSFlags |= MATCHDOTFILES | MATCHINFOFILES | SHOWHIDDEN;
  710. X    break;
  711. X      case 'B':
  712. X    if (argv[cnt][i+1] != 0)        /* Blocksize tail of same arg?  */
  713. X    {
  714. X      (VOID) GetDecNum(&argv[cnt][i+1], &blksize);        /* Yes */
  715. X      i = len;            /* Blow off rest of this arg */
  716. X    }
  717. X    else
  718. X    {
  719. X      if (argc < (ncnt + 1))     /* Missing required blocksize number */
  720. X      {
  721. X        badopt[0] = argv[cnt][i];
  722. X        Usage(MISSING_ARG);
  723. X      }
  724. X      (VOID) GetDecNum(argv[ncnt], &blksize);
  725. X      ncnt += 1;             /* Bump arg counter */
  726. X    }
  727. X    break;
  728. X      case 'C':
  729. X    LSFlags |= ONECOLFORMAT;
  730. X    break;
  731. X      case 'D':
  732. X    LSFlags |= SEPFILESDIRS | FILESFIRST;
  733. X    break;
  734. X      case 'E':
  735. X    LSFlags &= ~CONSOLE;
  736. X    break;
  737. X      case 'F':
  738. X    if (argv[cnt][i+1] != 0)        /* Format string tail of same arg? */
  739. X    {
  740. X      thefmtstr = &argv[cnt][i+1];    /* Yes */
  741. X      i = len;            /* Blow off rest of this arg */
  742. X    }
  743. X    else
  744. X    {
  745. X      if (argc < (ncnt + 1))     /* Missing required format string */
  746. X      {
  747. X        badopt[0] = argv[cnt][i];
  748. X        Usage(MISSING_ARG);
  749. X      }
  750. X      thefmtstr = argv[ncnt];    /* Else our format string is the next arg */
  751. X      ncnt += 1;             /* Bump arg counter */
  752. X    }
  753. X    LSFlags |= LONGLIST | OLDLONGFORMAT;
  754. X    break;
  755. X      case 'G':
  756. X    LSFlags |= NODIRTOTAL;
  757. X    break;
  758. X      case 'H':
  759. X    LSFlags |= NOHEADERS;
  760. X    break;
  761. X      case 'I':
  762. X    LSFlags |= NOINTERACT;
  763. X    break;
  764. X      case 'K':
  765. X    LSFlags |= SHOWDISKKEYS | LONGLIST;
  766. X    break;
  767. X      case 'L':
  768. X    if (argv[cnt][i+1] != 0)        /* Depth limit tail of same arg?   */
  769. X    {
  770. X      (VOID) GetDecNum(&argv[cnt][i+1], &recurlimit);     /* Yes */
  771. X      i = len;            /* Blow off rest of this arg */
  772. X    }
  773. X    else
  774. X    {
  775. X      if (argc < (ncnt + 1))     /* Missing required depth number */
  776. X      {
  777. X        badopt[0] = argv[cnt][i];
  778. X        Usage(MISSING_ARG);
  779. X      }
  780. X      (VOID) GetDecNum(argv[ncnt], &recurlimit);
  781. X      ncnt += 1;             /* Bump arg counter */
  782. X    }
  783. X    LSFlags |= LISTALL;
  784. X    break;
  785. X      case 'M':
  786. X    LSFlags |= IGNORECASEWILD;
  787. X    break;
  788. X      case 'N':
  789. X    if (argv[cnt][i+1] != 0)        /* Filename string tail of same arg? */
  790. X    {
  791. X      if (GetFileDate(&argv[cnt][i+1], &thenewdate) == 0)
  792. X      {
  793. X        errmsg(&argv[cnt][i+1], -1L);
  794. X        cleanup(ioerrcode, 20L);
  795. X      }
  796. X      i = len;            /* Blow off rest of this arg */
  797. X    }
  798. X    else
  799. X    {
  800. X      if (argc < (ncnt + 1))     /* Missing required name string */
  801. X      {
  802. X        badopt[0] = argv[cnt][i];
  803. X        Usage(MISSING_ARG);
  804. X      }
  805. X      if (GetFileDate(argv[ncnt], &thenewdate) == 0)
  806. X      {
  807. X        errmsg(argv[ncnt], -1L);
  808. X        cleanup(ioerrcode, 20L);
  809. X      }
  810. X      ncnt += 1;             /* Bump arg counter */
  811. X    }
  812. X    LSFlags |= SHOWNEWERTHAN;
  813. X    break;
  814. X      case 'O':
  815. X    if (argv[cnt][i+1] != 0)        /* Filename string tail of same arg? */
  816. X    {
  817. X      if (GetFileDate(&argv[cnt][i+1], &theolddate) == 0)
  818. X      {
  819. X        errmsg(&argv[cnt][i+1], -1L);
  820. X        cleanup(ioerrcode, 20L);
  821. X      }
  822. X      i = len;            /* Blow off rest of this arg */
  823. X    }
  824. X    else
  825. X    {
  826. X      if (argc < (ncnt + 1))     /* Missing required name string */
  827. X      {
  828. X        badopt[0] = argv[cnt][i];
  829. X        Usage(MISSING_ARG);
  830. X      }
  831. X      if (GetFileDate(argv[ncnt], &theolddate) == 0)
  832. X      {
  833. X        errmsg(argv[ncnt], -1L);
  834. X        cleanup(ioerrcode, 20L);
  835. X      }
  836. X      ncnt += 1;             /* Bump arg counter */
  837. X    }
  838. X    LSFlags |= SHOWOLDERTHAN;
  839. X    break;
  840. X      case 'P':
  841. X    LSFlags |= FULLPATHNAMES | LONGLIST;
  842. X    break;
  843. X      case 'Q':
  844. X    procp = (struct Process *)FindTask(0L);
  845. X    procp->pr_WindowPtr = OldWindowPtr;
  846. X    break;
  847. X      case 'R':
  848. X    recurlimit = MAXDEPTH;
  849. X    LSFlags |= LISTALL;
  850. X    break;
  851. X      case 'S':
  852. X    LSFlags |= SEPFILESDIRS;
  853. X    break;
  854. X      case 'T':
  855. X    LSFlags |= TOTALIZE;
  856. X    break;
  857. X      case 'V':
  858. X    LSFlags |= RELPATHNAMES | LONGLIST;
  859. X    break;
  860. X      case 'W':
  861. X    LSFlagsX |= NOWILDPATHDIRS;
  862. X    break;
  863. X      case 'X':
  864. X    if (argv[cnt][i+1] != 0)        /* Width tail of same arg?   */
  865. X    {
  866. X      (VOID) GetDecNum(&argv[cnt][i+1], &CurWinCols);     /* Yes */
  867. X      i = len;            /* Blow off rest of this arg */
  868. X    }
  869. X    else
  870. X    {
  871. X      if (argc < (ncnt + 1))     /* Missing required width number */
  872. X      {
  873. X        badopt[0] = argv[cnt][i];
  874. X        Usage(MISSING_ARG);
  875. X      }
  876. X      (VOID) GetDecNum(argv[ncnt], &CurWinCols);
  877. X      ncnt += 1;             /* Bump arg counter */
  878. X    }
  879. X    if ((CurWinCols < 12) || (CurWinCols > WORKSIZE)) CurWinCols = 0;
  880. X    break;
  881. X      case 'Y':
  882. X    if (argv[cnt][i+1] != 0)        /* Height tail of same arg?  */
  883. X    {
  884. X      (VOID) GetDecNum(&argv[cnt][i+1], &CurWinRows);     /* Yes */
  885. X      i = len;            /* Blow off rest of this arg */
  886. X    }
  887. X    else
  888. X    {
  889. X      if (argc < (ncnt + 1))     /* Missing required height number */
  890. X      {
  891. X        badopt[0] = argv[cnt][i];
  892. X        Usage(MISSING_ARG);
  893. X      }
  894. X      (VOID) GetDecNum(argv[ncnt], &CurWinRows);
  895. X      ncnt += 1;             /* Bump arg counter */
  896. X    }
  897. X    if (CurWinRows < 4) CurWinRows = 0;
  898. X    break;
  899. X      case 'Z':
  900. X    LSFlags |= CONSOLE | NOINTERACT; /* special purpose hack - see docs */
  901. X    break;
  902. X      case 'a':
  903. X    LSFlags |= MATCHDOTFILES;
  904. X    break;
  905. X      case 'b':
  906. X    LSFlagsX |= DATABLKSONLY;
  907. X    break;
  908. X      case 'c':
  909. X    LSFlags |= NOTEFLAG | LONGLIST;
  910. X    break;
  911. X      case 'd':
  912. X    LSFlags &= ~SHOWFILES;
  913. X    break;
  914. X      case 'e':
  915. X    exbit = 'e';
  916. X    break;
  917. X      case 'f':
  918. X    LSFlags &= ~SHOWDIRS;
  919. X    break;
  920. X      case 'h':
  921. X    LSFlags |= SHOWHIDDEN;
  922. X    break;
  923. X      case 'i':
  924. X    LSFlags |= MATCHINFOFILES;
  925. X    break;
  926. X      case 'k':
  927. X    sortkey = 3;
  928. X    LSFlags |= SHOWDISKKEYS;
  929. X    break;
  930. X      case 'l':
  931. X    LSFlags |= LONGLIST;
  932. X    break;
  933. X      case 'm':
  934. X    LSFlags |= IGNORECASELIST;
  935. X    break;
  936. X      case 'n':
  937. X    LSFlags |= NOSORTFLAG;
  938. X    break;
  939. X      case 'o':
  940. X    LSFlags |= OLDLONGFORMAT;
  941. X    break;
  942. X      case 'p':
  943. X    LSFlags |= ADDDIRSLASH;
  944. X    break;
  945. X      case 'q':
  946. X    LSFlagsX |= NOTFOUNDHALT;
  947. X    break;
  948. X      case 'r':
  949. X    LSFlags |= REVFLAG;
  950. X    break;
  951. X      case 's':
  952. X    sortkey = 1;
  953. X    break;
  954. X      case 't':
  955. X    sortkey = 2;
  956. X    break;
  957. X      case 'v':
  958. X    LSFlags |= VARCOLSFORMAT;
  959. X    break;
  960. X      case 'x':
  961. X    if (argv[cnt][i+1] != 0)        /* Pattern tail of same arg? */
  962. X    {
  963. X      theAntiPat = &argv[cnt][i+1]; /* Yup */
  964. X      i = len;            /* Blow off rest of this arg */
  965. X    }
  966. X    else
  967. X    {
  968. X      if (argc < (ncnt + 1))        /* Missing required pattern string */
  969. X      {
  970. X        badopt[0] = argv[cnt][i];
  971. X        Usage(MISSING_ARG);
  972. X      }
  973. X      theAntiPat = argv[ncnt];    /* Point to pattern area */
  974. X      ncnt += 1;            /* Skip over arg */
  975. X    }
  976. X    LSFlags |= ANTIMATCH;        /* Set flag to use antipat */
  977. X    break;
  978. X      case 'z':
  979. X    LSFlagsX |= NOFIXNUMBLOCKS;  /* special purpose hack - see docs */
  980. X    break;
  981. X      case '0':     /*  AGE_TO_YEARS:  MMM dD HH:MM   or   MMM dD  YYYY  */
  982. X      case '1':     /*  FULL_FORM:     MMM DD YYYY  HH:MM:SS             */
  983. X      case '2':     /*  DASHA_FORM:    DD-MMM-YY HH:MM:SS                */
  984. X      case '3':     /*  DASHN_FORM:    MM-DD-YY HH:MM:SS                 */
  985. X      case '4':     /*  SLASH_FORM:    MM/DD/YY HH:MM:SS                 */
  986. X      case '5':     /*  EURO_FORM:     DD/MM/YY HH:MM:SS                 */
  987. X      case '6':     /*  DOT_FORM:      YY.MM.DD HH:MM:SS                 */
  988. X    datefmt = argv[cnt][i] - '0';
  989. X    break;
  990. X      default:
  991. X    badopt[0] = argv[cnt][i];
  992. X    Usage(ILLEGAL_ARG);
  993. X    }
  994. X  }
  995. X  return(ncnt);
  996. X}
  997. X
  998. X
  999. X/* -------------------------------------------------------------------- */
  1000. XVOID _main (line)
  1001. X  BYTE *line;
  1002. X{
  1003. X  BYTE *argv[MAXARG];          /* arg pointers */
  1004. X  LONG    argc;              /* arg count */
  1005. X  LONG    cnt;
  1006. X  struct Process *procp;
  1007. X
  1008. X/* Prevent system request from occuring by default */
  1009. X  procp = (struct Process *)FindTask(0L);
  1010. X  OldWindowPtr = procp->pr_WindowPtr;
  1011. X  procp->pr_WindowPtr = SUPPRESS_ERR_REQ;
  1012. X
  1013. X/* Construct list of args */
  1014. X  GetCLIArgs(line, &argc, argv);
  1015. X
  1016. X/* Grab FileHandles for input and output to console (or redirection file) */
  1017. X  ConIn  = (struct FileHandle *)Input();
  1018. X  ConOut = (struct FileHandle *)Output();
  1019. X
  1020. X/* Is this a CLI? Set a flag */
  1021. X  if ((IsInteractive((BPTR)ConOut) != 0) && (IsInteractive((BPTR)ConIn) != 0))
  1022. X    LSFlags |= CONSOLE;
  1023. X
  1024. X/* Allocate a global FileInfoBlock for ExNext() */
  1025. X  if ((GFibp = myalloc((LONG)sizeof(struct FileInfoBlock))) == 0)
  1026. X    errmsg(NULLSTR, ERROR_NO_FREE_STORE);
  1027. X
  1028. X/* Allocate a global ID for Info() */
  1029. X  if ((CurID = myalloc((LONG)sizeof(struct InfoData))) == 0)
  1030. X    errmsg(NULLSTR, ERROR_NO_FREE_STORE);
  1031. X
  1032. X/* Initialize arg count, zero grand totals */
  1033. X  cnt = 1;
  1034. X  gtotblocks = gtotbytes = gdircount = gfilecount = gentrycnt = gitemcnt= 0;
  1035. X
  1036. X/* Get the path of the dir we were in when invoked [NO ERROR CHECKING] */
  1037. X  MakePathString((struct FileLock *)procp->pr_CurrentDir, initialpath);
  1038. X
  1039. X/* Parse command line arguments, if any */
  1040. X  do
  1041. X  {
  1042. X    if ((cnt < argc) && (argv[cnt][0] == '-'))
  1043. X    {
  1044. X    /* Reset for next arg */
  1045. X      LSFlags    &= CONSOLE;
  1046. X      LSFlags    |= SHOWDIRS | SHOWFILES;
  1047. X      LSFlagsX     = 0;
  1048. X      thefmtstr  = deffmtstr;
  1049. X      recurlimit = MAXDEPTH;
  1050. X
  1051. X      do
  1052. X      {
  1053. X    if (argv[cnt][1] == 0)
  1054. X    {
  1055. X      cnt++;
  1056. X      break;
  1057. X    }
  1058. X    cnt = ParseCmdOptions(cnt, argc, argv);
  1059. X      } while ((cnt < argc) && (argv[cnt][0] == '-'));
  1060. X    }
  1061. X
  1062. X    LSFlagsX &= ~WILDPATHFLAG;
  1063. X    LSFlagsX &= ~SINGLEFILEFLAG;
  1064. X    LSFlagsX &= ~EMPTYDIRFLAG;
  1065. X
  1066. X    theFilePat[0] = 0;                 /* Terminate pattern strings */
  1067. X    theDirPat[0]  = 0;
  1068. X
  1069. X  /* Is there an named path arg to do? */
  1070. X    if (cnt < argc)
  1071. X    {
  1072. X      LSFlags |= PATHNAMED;             /* Flag that we have a name */
  1073. X      stpcpy(thePath, argv[cnt]);            /* Copy this arg to work space */
  1074. X      cnt++;                     /* Advance arg counter */
  1075. X
  1076. X    /* Wild pathname? Separate into components until we find a non-wild path */
  1077. X      if (iswild(thePath) != 0)
  1078. X      {
  1079. X    (VOID) GetFileString(theFilePat, thePath);
  1080. X    (VOID) stpcpy(theDirPat, theFilePat);
  1081. X    (VOID) GetPathString(thePath, thePath);
  1082. X
  1083. X      /* Still wild?  First part must be wild filename to match */
  1084. X    if (iswild (thePath) != 0)
  1085. X    {
  1086. X      (VOID) GetFileString(theDirPat, thePath);
  1087. X      (VOID) GetPathString(thePath, thePath);
  1088. X    }
  1089. X
  1090. X    if ((LSFlagsX & NOWILDPATHDIRS) == 0)
  1091. X    {
  1092. X      LSFlags  |= WILDPATH;
  1093. X      LSFlagsX |= WILDPATHFLAG;
  1094. X    }
  1095. X      }
  1096. X      else
  1097. X      {
  1098. X    LSFlags  &= ~WILDPATH;
  1099. X    LSFlagsX &= ~WILDPATHFLAG;
  1100. X      }
  1101. X
  1102. X#ifdef DEBUGIT
  1103. X      asprintf(workstr, "   thePath: %s\n", thePath);    WSTR(workstr);
  1104. X      asprintf(workstr, " theDirPat: %s\n", theDirPat);  WSTR(workstr);
  1105. X      asprintf(workstr, "theFilePat: %s\n", theFilePat); WSTR(workstr);
  1106. X#endif
  1107. X
  1108. X    /* Filenames and dir nodes currently limited to 30 chars under AmigaDOS */
  1109. X      if ((strlen(theDirPat) > MAXFNLEN+1) || (strlen(theFilePat) > MAXFNLEN+1))
  1110. X      {
  1111. X    errmsg(NULLSTR, PATTERN_ERR);
  1112. X    if ((LSFlagsX & NOTFOUNDHALT) != 0)
  1113. X      cleanup(120L, 20L);
  1114. X    else
  1115. X      continue;
  1116. X      }
  1117. X
  1118. X    /* No wildcards allowed in the final pathname! */
  1119. X      if (iswild(thePath) != 0)
  1120. X      {
  1121. X    errmsg(argv[cnt-1], WILDSPEC_ERR);
  1122. X    if ((LSFlagsX & NOTFOUNDHALT) != 0)
  1123. X      cleanup(120L, 20L);
  1124. X    else
  1125. X      continue;
  1126. X      }
  1127. X
  1128. X    /* Now try to lock the dir (or file) */
  1129. X      if ((CurFLock = (struct FileLock *)Lock(thePath, (LONG)ACCESS_READ)) == 0)
  1130. X      {
  1131. X    errmsg(thePath, -1L);
  1132. X    if ((LSFlagsX & NOTFOUNDHALT) != 0)
  1133. X      cleanup(ioerrcode, 20L);
  1134. X    else
  1135. X      continue;
  1136. X      }
  1137. X    }
  1138. X    else
  1139. X    {
  1140. X    /*
  1141. X     * If no filename was specified, steal Lock on current directory from
  1142. X     * CLI process task info.  We durn well better get something useful back;
  1143. X     * since we don't do any error checking on the "borrowed" Lock.
  1144. X     */
  1145. X      CurFLock = (struct FileLock *)procp->pr_CurrentDir;
  1146. X    }
  1147. X
  1148. X  /* Make a full pathname string from given CurFLock if no colon in path */
  1149. X    if (aindex(thePath, ':') == 0)
  1150. X      MakePathString(CurFLock, thePath);
  1151. X    curpath = thePath;
  1152. X
  1153. X#ifdef DEBUGIT
  1154. X    asprintf(workstr, "Final path: %s\n", thePath); WSTR(workstr);
  1155. X#endif
  1156. X
  1157. X  /* If there isn't a dir pattern or file pattern specified, match everything */
  1158. X    if (theDirPat[0] == 0)
  1159. X    {
  1160. X      theDirPat[0] = '*';               /* "*" default matchall dir pattern */
  1161. X      theDirPat[1] = 0;         /* Null terminate string */
  1162. X    }
  1163. X
  1164. X    if (theFilePat[0] == 0)
  1165. X    {
  1166. X      theFilePat[0] = '*';
  1167. X      theFilePat[1] = 0;
  1168. X    }
  1169. X
  1170. X  /* Auto enable display of dot files, if explicitally specified as filespec */
  1171. X    if ((theFilePat[0] == '.') || (theDirPat[0] == '.') || (thePath[0] == '.'))
  1172. X      LSFlags |= MATCHDOTFILES;
  1173. X
  1174. X  /* Get the directory for this path, display it */
  1175. X    if (recurlevel != recurlimit)
  1176. X      DirIt(CurFLock, thePath);
  1177. X
  1178. X  /* Release the lock if we locked it */
  1179. X    if ((CurFLock != 0) && ((LSFlags & PATHNAMED) != 0))
  1180. X      UnLock((BPTR)CurFLock);
  1181. X    CurFLock = 0;
  1182. X
  1183. X    TestBreak();
  1184. X    if ((LSFlags & BREAKFLAG) == 0)
  1185. X    {
  1186. X    /* Still more args and previous not a single file or empty dir?  Put linefeed between listing outputs */
  1187. X      if ((cnt < argc) && ((LSFlags & NOHEADERS) == 0) && ((LSFlagsX & SINGLEFILEFLAG) == 0) &&
  1188. X      ((LSFlagsX & EMPTYDIRFLAG) == 0))
  1189. X    WCHR(NLine);
  1190. X
  1191. X      if ((cnt >= argc) && ((LSFlags & TOTALIZE) != 0) && (gentrycnt != 1) && (gitemcnt != 0))
  1192. X      {
  1193. X    if (gentrycnt != 0)
  1194. X    {
  1195. X      SetConPen(penstr3);
  1196. X      WSTR(TotHeaderMsg);
  1197. X      SetConPen(penstr0);
  1198. X      asprintf(workstr, totalfmtstr, gdircount, gfilecount, gtotblocks, gtotbytes);
  1199. X    }
  1200. X    else
  1201. X      asprintf (workstr, filefmtstr, gfilecount, gtotblocks, gtotbytes);
  1202. X    WSTR(workstr);
  1203. X      }
  1204. X    }
  1205. X  } while ((cnt < argc) && ((LSFlags & BREAKFLAG) == 0));
  1206. X
  1207. X/* All done!  Clean exit */
  1208. X  cleanup(0, 0);
  1209. X}
  1210. END_OF_FILE
  1211. if test 20364 -ne `wc -c <'src/ls.c.ab'`; then
  1212.     echo shar: \"'src/ls.c.ab'\" unpacked with wrong size!
  1213. fi
  1214. # end of 'src/ls.c.ab'
  1215. fi
  1216. echo shar: End of archive 2 \(of 4\).
  1217. cp /dev/null ark2isdone
  1218. MISSING=""
  1219. for I in 1 2 3 4 ; do
  1220.     if test ! -f ark${I}isdone ; then
  1221.     MISSING="${MISSING} ${I}"
  1222.     fi
  1223. done
  1224. if test "${MISSING}" = "" ; then
  1225.     echo You have unpacked all 4 archives.
  1226.     rm -f ark[1-9]isdone
  1227. else
  1228.     echo You still need to unpack the following archives:
  1229.     echo "        " ${MISSING}
  1230. fi
  1231. ##  End of shell archive.
  1232. exit 0
  1233. -- 
  1234. Mail submissions (sources or binaries) to <amiga@cs.odu.edu>.
  1235. Mail comments to the moderator at <amiga-request@cs.odu.edu>.
  1236. Post requests for sources, and general discussion to comp.sys.amiga.
  1237.